home *** CD-ROM | disk | FTP | other *** search
/ Languguage OS 2 / Languguage OS II Version 10-94 (Knowledge Media)(1994).ISO / a_utils / decomp.lha / decomp / objfile.c < prev    next >
C/C++ Source or Header  |  1988-01-12  |  4KB  |  214 lines

  1. /*
  2.  * Module: objfile.c
  3.  *
  4.  * Author: J. Reuter
  5.  *
  6.  * This module contains code that reads the various parts of object
  7.  * and a.out symbol tables.  These "parts" include the symbol table
  8.  * proper, the "string" table that contains the symbol names, and
  9.  * the relocation table, if it exists.
  10.  */
  11.  
  12. #include "defs.h"
  13. #include "main.h"
  14. #include <sys/types.h>
  15. #include <sys/stat.h>
  16.  
  17. char *strtab;
  18.  
  19. struct nlist *symtab;
  20. int nsym;
  21.  
  22. struct relocation_info *rel;
  23. int nrel;
  24.  
  25. char *datatab;
  26. int ndata;
  27. int datoff;
  28.  
  29. sym_read()
  30. {
  31.     struct stat statbuf;
  32.     int stab_size;
  33.  
  34.     /* read the string table */
  35.  
  36.     fseek( objfile, N_STROFF( obj_header ), 0 );
  37.  
  38.     fstat( fileno( objfile ), &statbuf );
  39.  
  40.     stab_size = statbuf.st_size - N_STROFF( obj_header );
  41.  
  42.     strtab = (char *)malloc( stab_size );
  43.     if ( strtab == NULL ) {
  44.     fprintf( stderr, "Out of memory\n" );
  45.     exit( 1 );
  46.     }
  47.     fread( strtab, 1, stab_size, objfile );
  48.  
  49.     /* read the symbol table proper */
  50.  
  51.     fseek( objfile, N_SYMOFF( obj_header ), 0 );
  52.     nsym = obj_header.a_syms;
  53.     symtab = (struct nlist *) malloc( nsym );
  54.     if ( symtab == NULL ) {
  55.     fprintf( stderr, "Out of memory\n" );
  56.     exit( 1 );
  57.     }
  58.     fread( symtab, 1, nsym, objfile );
  59.  
  60.     /* read the relocaion table */
  61.  
  62.     fseek( objfile, N_TRLOFF( obj_header ), 0 );
  63.     nrel = obj_header.a_trsize + obj_header.a_drsize;
  64.     rel = (struct relocation_info *) malloc( nrel );
  65.     if ( rel == NULL ) {
  66.     fprintf( stderr, "Out of memory\n" );
  67.     exit( 1 );
  68.     }
  69.     fread( rel, 1, nrel, objfile );
  70.  
  71.     /* read initialized data */
  72.  
  73.     datoff = N_DATOFF( obj_header );
  74.     fseek( objfile, datoff, 0 );
  75.     ndata = N_TRLOFF( obj_header) - datoff;
  76.     datatab = malloc( ndata );
  77.     if ( datatab == NULL ) {
  78.     fprintf( stderr, "Out of memory\n" );
  79.     exit( 1 );
  80.     }
  81.     fread( datatab, 1, ndata, objfile );
  82.     datoff -= N_TXTOFF( obj_header ); /* offset by header size */
  83. }
  84.  
  85. struct relocation_info *relo_cur;
  86.  
  87. relo_first()
  88. {
  89.     relo_cur = rel;
  90. }
  91.  
  92. struct relocation_info *
  93. relo_next()
  94. {
  95.     if ( relo_cur - rel >= nrel )
  96.     return NULL;
  97.     else
  98.     return relo_cur++;
  99. }
  100.  
  101. sym_find( addr )
  102. address addr;
  103. {
  104.     int i;
  105.  
  106.     for ( i=0; i < nsym/sizeof(struct nlist); i++ )
  107.     if ( (symtab+i)->n_value == addr )
  108.         return i;
  109.  
  110.     return -1;
  111. }
  112.  
  113. char *
  114. prname( name )
  115. char *name;
  116. {
  117.     if ( name[0] == '_' )
  118.     return name + 1;
  119.     else
  120.     return name;
  121. }
  122.  
  123. #ifdef debug
  124.  
  125. symdump()
  126. {
  127.     register int i;
  128.     register struct nlist *s;
  129.  
  130.     printf( "Name            Type Other   Desc      Value\n" );
  131.     for ( i=0; i<nsym/sizeof(struct nlist); i++ ) {
  132.     s = symtab+i;
  133.     printf( "%-15s %3d  %4d  %6x  %8d\n",
  134.            &strtab[s->n_un.n_strx], s->n_type, s->n_other,
  135.            s->n_desc, s->n_value );
  136.     }
  137. }
  138.  
  139. reldump( start, count )
  140. int start;
  141. int count;
  142. {
  143.     int i;
  144.     struct nlist *s;
  145.  
  146.     start /= sizeof( struct relocation_info );
  147.     count /= sizeof( struct relocation_info );
  148.  
  149.     printf( " Address   Pcrel Length Extrn Stype  Sval  Sname\n" );
  150.     for ( i=start; i < count+start; i++ ) {
  151.     s = &symtab[(rel+i)->r_symbolnum];
  152.     printf( "%8d %5d %6d  %3d    %3d %6d   %-30s\n",
  153.            (rel+i)->r_address,
  154.            (rel+i)->r_pcrel, (rel+i)->r_length, (rel+i)->r_extern,
  155.            s->n_type, s->n_value, &strtab[s->n_un.n_strx] );
  156.     }
  157. }
  158. #endif debug
  159.  
  160. /*
  161.  * The following routines allow reading of the code section of the
  162.  * object file.
  163.  */
  164.  
  165. static long current_pos = 0;
  166.  
  167. char
  168. get_byte( addr )
  169. address addr;
  170. {
  171.     char byte;
  172.  
  173.     if ( addr != current_pos ) {
  174.     fseek( objfile, offset + addr, 0 );
  175.     current_pos = addr;
  176.     }
  177.  
  178.     fread( &byte, sizeof(byte), 1, objfile );
  179.     current_pos += 1;
  180.     return byte;
  181. }
  182.  
  183. short
  184. get_word( addr )
  185. address addr;
  186. {
  187.     short word;
  188.  
  189.     if ( addr != current_pos ) {
  190.     fseek( objfile, offset + addr, 0 );
  191.     current_pos = addr;
  192.     }
  193.  
  194.     fread( &word, sizeof(word), 1, objfile );
  195.     current_pos += 2;
  196.     return word;
  197. }
  198.  
  199. long
  200. get_long( addr )
  201. address addr;
  202. {
  203.     long longword;
  204.  
  205.     if ( addr != current_pos ) {
  206.     fseek( objfile, offset + addr, 0 );
  207.     current_pos = addr;
  208.     }
  209.  
  210.     fread( &longword, sizeof(longword), 1, objfile );
  211.     current_pos += 4;
  212.     return longword;
  213. }
  214.